﻿using Autofac;
using wwl.Application.Services;
using wwl.Contract.Interfaces.Security;
using wwl.Infrastructure.Security.Hashing;

namespace wwl.WebApi.AutofacModeules
{
  /// <summary>
  /// Autofac安全模块
  /// 负责注册应用程序中哈希相关的服务和组件
  /// </summary>
  /// <remarks>
  /// 继承自Autofac的Module基类，通过重写Load方法配置依赖注入规则
  /// 该模块应在Autofac容器初始化时被加载，确保安全相关服务的正确注册
  /// </remarks>
  public class HasherModule : Module
  {
    /// <summary>
    /// 重写Autofac模块的Load方法，配置安全相关服务的依赖注入
    /// </summary>
    /// <param name="builder">Autofac容器构建器，用于注册服务和组件</param>
    /// <remarks>
    /// 在此方法中注册的服务会被Autofac容器管理，支持构造函数注入等依赖注入模式
    /// 注册规则包括服务类型、实现类型、生命周期管理和参数配置等
    /// </remarks>
    protected override void Load(ContainerBuilder builder)
    {
      // 注册密码哈希器服务
      builder.RegisterType<BcryptHasher>()
          .As<IHasher>() // 将BcryptHasher实现注册为IHasher接口
          .WithParameter("workFactor", 12) // 配置BCrypt哈希算法的工作因子（复杂度），可根据环境配置调整
          .SingleInstance(); // 哈希器为无状态组件，使用单例生命周期，提高性能

      // 注册密码服务
      builder.RegisterType<PasswordService>()
          .AsSelf() // 注册为自身类型（不通过接口暴露）
          .InstancePerLifetimeScope(); // 每个生命周期作用域（如每个请求）创建一个实例，适用于有状态服务
    }
  }
}